package org.threegroup.controller;

import cn.hutool.json.JSONUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.threegroup.entity.WareHouse;
import org.threegroup.mappers.WareHouseMappers;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 仓库管理控制器
 * 处理与仓库相关的HTTP请求，通过MyBatis与数据库交互，返回JSON格式响应
 * 映射的请求路径为：/warehouse
 */
@WebServlet("/warehouse")
public class WareHouseController extends HttpServlet {

    // MyBatis核心对象：SqlSession工厂，用于创建SqlSession
    private SqlSessionFactory sqlSessionFactory;
    // MyBatis会话对象，用于执行SQL操作
    private SqlSession sqlSession;
    // 仓库数据访问接口，通过MyBatis动态代理生成实现类
    private WareHouseMappers wareHouseMappers;

    /**
     * 初始化方法
     * 在Servlet实例化后被调用，用于初始化MyBatis相关组件
     * 加载MyBatis配置文件，创建SqlSessionFactory、SqlSession和Mapper接口实例
     */
    public void init(){
        // 加载MyBatis核心配置文件（mybatis-config.xml）
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
        // 根据配置文件构建SqlSessionFactory
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 打开SqlSession，参数true表示自动提交事务
        sqlSession = sqlSessionFactory.openSession(true);
        // 获取WareHouseMappers接口的代理实现类，用于数据库操作
        wareHouseMappers = sqlSession.getMapper(WareHouseMappers.class);

    }

    /**
     * 服务方法
     * 处理所有HTTP请求（GET/POST等），根据请求参数"methods"的值分发到对应的处理方法
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取请求参数"methods"，用于确定具体的操作类型
        String methods = req.getParameter("methods");
        // 如果未指定methods参数，直接返回，不进行处理
        if(methods==null){
            return;
        }
        // 根据methods参数值，调用查询所有仓库的方法
        else if(methods.equals("queryAllWareHouse")){
            queryAllWareHouse(req,resp);
        }

    }

    /**
     * 查询所有仓库信息
     * 从数据库查询所有仓库记录，封装成统一的JSON格式响应返回给客户端
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    public void queryAllWareHouse(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 调用Mapper接口方法，查询所有仓库数据
        List<WareHouse> wareHouses = wareHouseMappers.queryAllWareHouse();

        // 设置响应内容类型为JSON，字符编码为UTF-8，避免中文乱码
        resp.setContentType("application/json;charset=UTF-8");

        // 构建响应结果Map，采用前后端分离常用的响应格式
        Map<String,Object> result = new HashMap<>();
        if(wareHouses!=null){
            // 查询成功：code=0（成功标识），msg=success，count=数据总数，data=具体数据
            result.put("code",0);
            result.put("msg","success");
            result.put("count",wareHouses.size());
            result.put("data",wareHouses);
        }else{
            // 查询失败：code=1（失败标识），msg=fail，count=0，data=null
            result.put("code",1);
            result.put("msg","fail");
            result.put("count",0);
            result.put("data",null);
        }

        // 控制台打印结果，用于调试
        System.out.println(result);

        // 使用Hutool工具类将Map转换为JSON字符串
        String jsonStr = JSONUtil.toJsonStr(result);
        // 将JSON字符串写入响应，返回给客户端
        resp.getWriter().write(jsonStr);

    }

}